#include "struct.h"

/*****************************************
**  Nom : COLLOMB						**
**	Nom du fichier : DetectionTouche.c	**
**	Description : Detecte des l'appui 	**
**		d'une touche au clavier			**
**										**
**										**
**	Date : 25/08/2014				    **
**  Statut : Release					**
*****************************************/


/*************************************************
**  Zone de declaration des Fonctions PUBLIC    **
*************************************************/

/*************************************************************************
**  [DetectionTouche_Detect]               		    					**
**  	Appel toutes les fonctions pour pouvoir detecter une touche     **
**																		**
**	Entrees : NULL								                        **
**																		**
**																		**
**	Sorties : char														**
**				carac - Renvoi le caractere tape                        **
**									                                    **
**************************************************************************/
char DetectionTouche_Detect ()
{
	struct termios initial_settings;
	struct termios new_settings;
	
	int carac = 0; 

	DetectionTouche_Init_Keyboard(&initial_settings,&new_settings); 
	
	while(carac == 0)
	{  
		DetectionTouche_kbhit(&carac,&new_settings);
	} 
	DetectionTouche_Close_Keyboard(&initial_settings);
	return carac; 
}

/*************************************************
**  Zone de declaration des Fonctions PRIVE     **
*************************************************/

/*************************************************************************
**  [DetectionTouche_Init_Keyboard]                 		    		**
**  	Initialisatoin du clavier								        **
**																		**
**	Entrees : NULL								                        **
**																		**
**																		**
**	Sorties : NULL														**
**									                                    **
**									                                    **
**************************************************************************/
void DetectionTouche_Init_Keyboard(struct termios* initial_settings,struct termios* new_settings) 
{	
	tcgetattr(0,initial_settings); 
	memcpy(new_settings,initial_settings,sizeof(struct termios));
	new_settings->c_lflag &= ~ICANON; 
	new_settings->c_lflag &= ~ECHO; 
	new_settings->c_lflag &= ~ISIG; 
	new_settings->c_cc[VMIN] = 1; 
	new_settings->c_cc[VTIME] = 0; 
	tcsetattr(0, TCSANOW,new_settings); 	
}


/*************************************************
**  Zone de declaration des Fonctions PRIVE     **
*************************************************/

/*************************************************************************
**  [DetectionTouche_Close_Keyboard]                 		    		**
**  	Initialisatoin du clavier								        **
**																		**
**	Entrees : NULL								                        **
**																		**
**																		**
**	Sorties : NULL														**
**									                                    **
**									                                    **
**************************************************************************/
void DetectionTouche_Close_Keyboard(struct termios* initial_settings) 
{ 
	tcsetattr(0, TCSANOW, initial_settings); 
}


/*************************************************************************
**  [DetectionTouche_kbhit]        			         		    		**
**  	Permet de rendre non bloquant le getch					        **
**																		**
**	Entrees : NULL								                        **
**																		**
**																		**
**	Sorties : int														**
**				Si la valeur retournee est 1 alors il y a detection 	**
**				d'un caractere											**
**				Si la valeur retournee est 0 alors rien detecte         **
**									                                    **
**************************************************************************/
int DetectionTouche_kbhit(int* valeur,struct termios* new_settings) 
{ 
	int ch=0; 
	int nread=0;
	int peek_character = -1; 

	if(peek_character != -1) 
		return 1; 

	new_settings->c_cc[VMIN]=0; 
	tcsetattr(0, TCSANOW, new_settings); 
	nread = read(0,&ch,1); 
	new_settings->c_cc[VMIN]=1; 
	tcsetattr(0, TCSANOW, new_settings); 

	if(nread == 1)
	{ 
		peek_character = ch; 
		*valeur = ch;
		return 1; 
	} 
	return 0; 
}




